package com.sxj.corejava.code11_io.字节流;

import java.io.*;
import java.util.Date;

/**
 * @author 石小俊
 * @date 2024年05月16日 18:56
 */
public class Test01_FileInputStream {

    public static void main(String[] args) {
        test02();
    }

    public static void test01() {
        FileInputStream in = null;
        File file = new File("E:/itany/hello.txt");
        try {
            in = new FileInputStream(file);
            // 读取文件中的内容,每次读取一个字节,返回值是int类型
//            int data = in.read();
            // 其值是对应内容的ASCII码值
            // 如果是字符,可以通过char类型进行转换
            // 如果没有内容了,则返回-1
//            System.out.println((char)data);
            // 但是由于每次只能读取一个字节,这样读取起来比较麻烦
            // 如何自动读取所有内容?
            // 由于当没有内容时返回-1
            // 因此,我们读取时只要返回值不是-1就继续读取,直到返回值为-1为止
//            while (data != -1){
//                System.out.print((char)data);
//                data = in.read();
//            }

            // 简写方式
            int data = -1;
            while ((data = in.read()) != -1) {
                System.out.print((char) data);
            }
            // 如果文件内容中存在中文,会出现乱码问题
            // 中文根据字符集不同占2-3个字节
            // 每次读取不可能读取一个完整的中文,因此会出现乱码
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 对于流,结束之后需要释放
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void test02() {
        // 在JDK7之后又一个新语法
        // 由于流的时候最终都需要释放,因此每次都需要手动释放过于麻烦
        // 在JDK7中引入了一个新语法可以自动释放
        try (
                // 在此处定义的流均会自动释放
//                FileInputStream in = new FileInputStream(new File("aa.txt"));
                InputStream in = Test01_FileInputStream.class.getClassLoader().getResourceAsStream("aaa.txt");
                // 在此处并不是所有对象都能直接定义
                // 只有实现了AutoCloseable接口的对象可以在此处进行定义,用于自动释放资源
        ) {
//            int data = -1;
//            while ((data = in.read()) != -1){
//                System.out.print((char)data);
//            }

            // 可以一次性读取多个字节
            byte[] b = new byte[1024];
            int data = -1;
            // 此时方法的返回值表示读取了多少个字节
            // 读取的具体数据存放到byte数组中了
            // data = in.read(b);
            // System.out.println(data);
            while ((data = in.read(b)) != -1) {
                // 将byte数组转换成字符串
                System.out.println(new String(b, 0, data));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
